" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim

func! Test_run_fmt() abort
  let actual_file = tempname()
  call writefile(readfile("test-fixtures/fmt/hello.go"), actual_file)

  let expected = join(readfile("test-fixtures/fmt/hello_golden.go"), "\n")

  " run our code
  call go#fmt#run("gofmt", actual_file, "test-fixtures/fmt/hello.go")

  " this should now contain the formatted code
  let actual = join(readfile(actual_file), "\n")

  call assert_equal(expected, actual)
endfunc

func! Test_update_file() abort
  let expected = join(readfile("test-fixtures/fmt/hello_golden.go"), "\n")
  let source_file = tempname()
  call writefile(readfile("test-fixtures/fmt/hello_golden.go"), source_file)

  let target_file = tempname()
  call writefile([""], target_file)

  " update_file now
  call go#fmt#update_file(source_file, target_file)

  " this should now contain the formatted code
  let actual = join(readfile(target_file), "\n")

  call assert_equal(expected, actual)
endfunc

func! Test_goimports() abort
  let $GOPATH = 'test-fixtures/fmt/'
  let actual_file = tempname()
  call writefile(readfile("test-fixtures/fmt/src/imports/goimports.go"), actual_file)

  let expected = join(readfile("test-fixtures/fmt/src/imports/goimports_golden.go"), "\n")

  " run our code
  call go#fmt#run("goimports", actual_file, "test-fixtures/fmt/src/imports/goimports.go")

  " this should now contain the formatted code
  let actual = join(readfile(actual_file), "\n")

  call assert_equal(expected, actual)
endfunc

func! Test_run_fmt_gopls() abort
  try
    let g:go_fmt_command = 'gopls'

    let actual_file = tempname()
    call writefile(readfile("test-fixtures/fmt/hello.go"), actual_file)

    let expected = join(readfile("test-fixtures/fmt/hello_golden.go"), "\n")

    " run our code
    call go#fmt#run("gofmt", actual_file, "test-fixtures/fmt/hello.go")

    " this should now contain the formatted code
    let actual = join(readfile(actual_file), "\n")

    call assert_equal(expected, actual)
  finally
    unlet g:go_fmt_command
  endtry
endfunc

func! Test_update_file_gopls() abort
  try
    let g:go_fmt_command = 'gopls'

    let expected = join(readfile("test-fixtures/fmt/hello_golden.go"), "\n")
    let source_file = tempname()
    call writefile(readfile("test-fixtures/fmt/hello_golden.go"), source_file)

    let target_file = tempname()
    call writefile([""], target_file)

    " update_file now
    call go#fmt#update_file(source_file, target_file)

    " this should now contain the formatted code
    let actual = join(readfile(target_file), "\n")

    call assert_equal(expected, actual)
  finally
    unlet g:go_fmt_command
  endtry
endfunc

func! Test_goimports_gopls() abort
  try
    let g:go_fmt_command = 'gopls'

    let $GOPATH = 'test-fixtures/fmt/'
    let actual_file = tempname()
    call writefile(readfile("test-fixtures/fmt/src/imports/goimports.go"), actual_file)

    let expected = join(readfile("test-fixtures/fmt/src/imports/goimports_golden.go"), "\n")

    " run our code
    call go#fmt#run("goimports", actual_file, "test-fixtures/fmt/src/imports/goimports.go")

    " this should now contain the formatted code
    let actual = join(readfile(actual_file), "\n")

    call assert_equal(expected, actual)
  finally
    unlet g:go_fmt_command
  endtry
endfunc
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save

" vim: sw=2 ts=2 et
